#include "CoordF.h"

CoordF::CoordF() {
  x = y = z = 0.0;
}

CoordF::CoordF(GLfloat nx, GLfloat ny, GLfloat nz)
{
  x = nx;
  y = ny;
  z = nz;
}

CoordF::CoordF(GLfloat nx, GLfloat ny)
{
  x = nx;
  y = ny;
  z = 0.0;
}

CoordF::~CoordF()
{
}
             
CoordF CoordF::operator +(const CoordF &a)
{
  CoordF ret(x + a.x, y + a.y, z + a.z);
   
  return (ret);
}

CoordF CoordF::operator -(const CoordF &a)
{
  CoordF ret(x - a.x, y - a.y, z - a.z);
  
  return (ret);
}

CoordF CoordF::operator *(const GLfloat &a)
{
  CoordF ret(x * a, y * a, z * a);
  
  return (ret);
}

CoordF CoordF::operator /(const GLfloat &a)
{
  CoordF ret(x / a, y / a, z / a);
  
  return (ret);
}

CoordF& CoordF::operator -=(const CoordF &v)
{
	x -= v.x; y -= v.y; z -= v.z;
	return *this;
}

CoordF& CoordF::operator +=(const CoordF &v)
{
	x += v.x; y += v.y; z += v.z;
	return *this;
}


CoordF& CoordF::operator *=(const GLfloat &f)
{
	x *= f; y *= f; z *= f;
	return *this;
}

CoordF& CoordF::operator /=(const GLfloat &f)
{
	x /= f; y /= f; z /= f;
	return *this;
}

GLfloat CoordF::dot(const CoordF &a)
{
  return (x*a.x + y*a.y + z*a.z);
}

GLfloat CoordF::len2()
{
  return (x*x + y*y + z*z);
}

GLfloat CoordF::len()
{
  return (sqrt(len2()));
}
            
void CoordF::normalize()
{
  GLfloat tf = len();
  
  x /= tf;
  y /= tf;
  z /= tf;
}

void CoordF::rotateInX( GLfloat angle )
{
     GLfloat rad = toRadians(angle);
     GLfloat tempY = y;
     GLfloat tempZ = z;
     
     y = tempY * cos(rad) - tempZ * sin(rad);
     z = tempY * sin(rad) + tempZ * cos(rad);
}

void CoordF::rotateInY( GLfloat angle )
{
     GLfloat rad = toRadians(angle);
     GLfloat tempX = x;
     GLfloat tempZ = z;
     
     z = tempZ * cos(rad) - tempX * sin(rad);
     x = tempZ * sin(rad) + tempX * cos(rad);
}

void CoordF::rotateInZ( GLfloat angle )
{
     GLfloat rad = toRadians(angle);
     GLfloat tempX = x;
     GLfloat tempY = y;
     
     x = tempX * cos(rad) - tempY * sin(rad);
     y = tempX * sin(rad) + tempY * cos(rad);
}
